home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-11-11 | 30.8 KB | 870 lines | [TEXT/MPS ] |
- ;
- ; File: SCSI.a
- ;
- ; Copyright: © 1984-1994 by Apple Computer, Inc.
- ; All rights reserved.
- ;
- ; Version: Universal Interfaces 2.0a3 ETO #16, MPW prerelease. Friday, November 11, 1994.
- ;
- ; Bugs?: If you find a problem with this file, send the file and version
- ; information (from above) and the problem description to:
- ;
- ; Internet: apple.bugs@applelink.apple.com
- ; AppleLink: APPLE.BUGS
- ;
- ;
-
- IF &TYPE('__SCSI__') = 'UNDEFINED' THEN
- __SCSI__ SET 1
-
-
- IF &TYPE('__TYPES__') = 'UNDEFINED' THEN
- include 'Types.a'
- ENDIF
- ; include 'ConditionalMacros.a' ;
-
- IF &TYPE('__MIXEDMODE__') = 'UNDEFINED' THEN
- include 'MixedMode.a'
- ENDIF
-
- scInc EQU 1
- scNoInc EQU 2
- scAdd EQU 3
- scMove EQU 4
- scLoop EQU 5
- scNop EQU 6
- scStop EQU 7
- scComp EQU 8
-
- ; SCSI Manager errors
- scCommErr EQU 2 ; communications error, operation timeout
- scArbNBErr EQU 3 ; arbitration timeout waiting for not BSY
- scBadParmsErr EQU 4 ; bad parameter or TIB opcode
- scPhaseErr EQU 5 ; SCSI bus not in correct phase for attempted operation
- scCompareErr EQU 6 ; data compare error
- scMgrBusyErr EQU 7 ; SCSI Manager busy
- scSequenceErr EQU 8 ; attempted operation is out of sequence
- scBusTOErr EQU 9 ; CPU bus timeout
- scComplPhaseErr EQU 10 ; SCSI bus wasn't in Status phase
-
- ; Signatures
- sbSIGWord EQU $4552 ; signature word for Block 0 ('ER')
- sbMac EQU 1 ; system type for Mac
- pMapSIG EQU $504D ; partition map signature ('PM')
- pdSigWord EQU $5453
-
- oldPMSigWord EQU pdSigWord
- newPMSigWord EQU pMapSIG
-
- ; Driver Descriptor Map
- Block0 RECORD 0
- sbSig ds.w 1 ; unique value for SCSI block 0
- sbBlkSize ds.w 1 ; block size of device
- sbBlkCount ds.l 1 ; number of blocks on device
- sbDevType ds.w 1 ; device type
- sbDevId ds.w 1 ; device id
- sbData ds.l 1 ; not used
- sbDrvrCount ds.w 1 ; driver descriptor count
- ddBlock ds.l 1 ; 1st driver's starting block
- ddSize ds.w 1 ; size of 1st driver (512-byte blks)
- ddType ds.w 1 ; system type (1 for Mac+)
- ddPad ds.w 243 ; ARRAY[0..242] OF INTEGER; not used
- sizeof EQU 512
- ENDR
-
- ; Partition Map Entry
- Partition RECORD 0
- pmSig ds.w 1 ; unique value for map entry blk
- pmSigPad ds.w 1 ; currently unused
- pmMapBlkCnt ds.l 1 ; # of blks in partition map
- pmPyPartStart ds.l 1 ; physical start blk of partition
- pmPartBlkCnt ds.l 1 ; # of blks in this partition
- pmPartName ds.b 32 ; ASCII partition name
- pmParType ds.b 32 ; ASCII partition type
- pmLgDataStart ds.l 1 ; log. # of partition's 1st data blk
- pmDataCnt ds.l 1 ; # of blks in partition's data area
- pmPartStatus ds.l 1 ; bit field for partition status
- pmLgBootStart ds.l 1 ; log. blk of partition's boot code
- pmBootSize ds.l 1 ; number of bytes in boot code
- pmBootAddr ds.l 1 ; memory load address of boot code
- pmBootAddr2 ds.l 1 ; currently unused
- pmBootEntry ds.l 1 ; entry point of boot code
- pmBootEntry2 ds.l 1 ; currently unused
- pmBootCksum ds.l 1 ; checksum of boot code
- pmProcessor ds.b 16 ; ASCII for the processor type
- pmPad ds.w 188 ; 512 bytes long currently unused
- sizeof EQU 512
- ENDR
-
- ; TIB instruction
- SCSIInstr RECORD 0
- scOpcode ds.w 1
- scParam1 ds.l 1
- scParam2 ds.l 1
- sizeof EQU 10
- ENDR
-
- IF GENERATING68K THEN
- Macro
- _SCSIReset
- dc.w $4267
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIReset
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIGet
- move.w #$0001,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIGet
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSISelect
- move.w #$0002,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSISelect
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSICmd
- move.w #$0003,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSICmd
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIRead
- move.w #$0005,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIRead
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIRBlind
- move.w #$0008,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIRBlind
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIWrite
- move.w #$0006,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIWrite
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIWBlind
- move.w #$0009,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIWBlind
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIComplete
- move.w #$0004,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIComplete
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIStat
- move.w #$000A,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIStat
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSISelAtn
- move.w #$000B,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSISelAtn
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIMsgIn
- move.w #$000C,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIMsgIn
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIMsgOut
- move.w #$000D,-(sp)
- dc.w $A815
- EndM
- ELSE
- IMPORT SCSIMsgOut
- ENDIF
-
- ;——————————————————————— New SCSI Manager Interface ———————————————————————
-
- scsiVERSION EQU 43
-
- ; SCSI Manager function codes
- SCSINop EQU $00 ; Execute nothing
- SCSIExecIO EQU $01 ; Execute the specified IO
- SCSIBusInquiry EQU $03 ; Get parameters for entire path of HBAs
- SCSIReleaseQ EQU $04 ; Release the frozen SIM queue for particular LUN
- SCSIAbortCommand EQU $10 ; Abort the selected Control Block
- SCSIResetBus EQU $11 ; Reset the SCSI bus
- SCSIResetDevice EQU $12 ; Reset the SCSI device
- SCSITerminateIO EQU $13 ; Terminate any pending IO
- SCSIGetVirtualIDInfo EQU $80 ; Find out which bus old ID is on
- SCSILoadDriver EQU $82 ; Load a driver for a device ident
- SCSIOldCall EQU $84 ; XPT->SIM private call for old-API
- SCSICreateRefNumXref EQU $85 ; Register a DeviceIdent to drvr RefNum xref
- SCSILookupRefNumXref EQU $86 ; Get DeviceIdent to drvr RefNum xref
- SCSIRemoveRefNumXref EQU $87 ; Remove a DeviceIdent to drvr RefNum xref
- SCSIRegisterWithNewXPT EQU $88 ; XPT has changed - SIM needs to re-register itself
- vendorUnique EQU $C0 ; 0xC0 thru 0xFF
-
- ; SCSI Callback Procedure Prototypes
- handshakeDataLength EQU 8 ; Handshake data length
- maxCDBLength EQU 16 ; Space for the CDB bytes/pointer
- vendorIDLength EQU 16 ; ASCII string len for Vendor ID
-
- ; Define DeviceIdent structure
- DeviceIdent RECORD 0
- diReserved ds.b 1 ; reserved
- bus ds.b 1 ; SCSI - Bus Number
- targetID ds.b 1 ; SCSI - Target SCSI ID
- LUN ds.b 1 ; SCSI - LUN
- sizeof EQU 4
- ENDR
-
- ; Command Descriptor Block structure
- SGRecord RECORD 0
- SGAddr ds.l 1
- SGCount ds.l 1
- sizeof EQU 8
- ENDR
-
- ; SCSI Phases (used by SIMs to support the Original SCSI Manager
-
- kDataOutPhase EQU 0 ; Encoded MSG, C/D, I/O bits
- kDataInPhase EQU 1
- kCommandPhase EQU 2
- kStatusPhase EQU 3
- kPhaseIllegal0 EQU 4
- kPhaseIllegal1 EQU 5
- kMessageOutPhase EQU 6
- kMessageInPhase EQU 7
- kBusFreePhase EQU 8 ; Additional Phases
- kArbitratePhase EQU 9
- kSelectPhase EQU 10
- kMessageInPhaseNACK EQU 11 ; Message In Phase with ACK hanging on the bus
-
- SCSIHdr RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- sizeof EQU 36
- ENDR
-
- SCSI_PB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- sizeof EQU 36
- ENDR
-
- SCSI_IO RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiResultFlags ds.w 1
- scsiReserved3pt5 ds.w 1
- scsiDataPtr ds.l 1
- scsiDataLength ds.l 1
- scsiSensePtr ds.l 1
- scsiSenseLength ds.b 1
- scsiCDBLength ds.b 1
- scsiSGListCount ds.w 1
- scsiReserved4 ds.l 1
- scsiSCSIstatus ds.b 1
- scsiSenseResidual ds.b 1
- scsiReserved5 ds.w 1
- scsiDataResidual ds.l 1
- scsiCDB ds.w 3
- scsiTimeout ds.l 1
- scsiReserved5pt5 ds.l 1
- scsiReserved5pt6 ds.w 1
- scsiIOFlags ds.w 1
- scsiTagAction ds.b 1
- scsiReserved6 ds.b 1
- scsiReserved7 ds.w 1
- scsiSelectTimeout ds.w 1
- scsiDataType ds.b 1
- scsiTransferType ds.b 1
- scsiReserved8 ds.l 1
- scsiReserved9 ds.l 1
- scsiHandshake ds.w 1
- scsiReserved10 ds.l 1
- scsiReserved11 ds.l 1
- scsiCommandLink ds.l 1
- scsiSIMpublics ds.b 8
- scsiAppleReserved6 ds.b 8
- scsiCurrentPhase ds.w 1
- scsiSelector ds.w 1
- scsiOldCallResult ds.w 1
- scsiSCSImessage ds.b 1
- XPTprivateFlags ds.b 1
- XPTextras ds.b 12
- sizeof EQU 152
- ENDR
-
- ; Bus inquiry PB
- SCSIBusInquiryPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiEngineCount ds.w 1 ; <- Number of engines on HBA
- scsiMaxTransferType ds.w 1 ; <- Number of transfer types for this HBA
- scsiDataTypes ds.l 1 ; <- which data types are supported by this SIM
- scsiIOpbSize ds.w 1 ; <- Size of SCSI_IO PB for this SIM/HBA
- scsiMaxIOpbSize ds.w 1 ; <- Size of max SCSI_IO PB for all SIM/HBAs
- scsiFeatureFlags ds.l 1 ; <- Supported features flags field
- scsiVersionNumber ds.b 1 ; <- Version number for the SIM/HBA
- scsiHBAInquiry ds.b 1 ; <- Mimic of INQ byte 7 for the HBA
- scsiTargetModeFlags ds.b 1 ; <- Flags for target mode support
- scsiScanFlags ds.b 1 ; <- Scan related feature flags
- scsiSIMPrivatesPtr ds.l 1 ; <- Ptr to SIM private data area
- scsiSIMPrivatesSize ds.l 1 ; <- Size of SIM private data area
- scsiAsyncFlags ds.l 1 ; <- Event cap. for Async Callback
- scsiHiBusID ds.b 1 ; <- Highest path ID in the subsystem
- scsiInitiatorID ds.b 1 ; <- ID of the HBA on the SCSI bus
- scsiBIReserved0 ds.w 1 ;
- scsiBIReserved1 ds.l 1 ; <-
- scsiFlagsSupported ds.l 1 ; <- which scsiFlags are supported
- scsiIOFlagsSupported ds.w 1 ; <- which scsiIOFlags are supported
- scsiWeirdStuff ds.w 1 ; <-
- scsiMaxTarget ds.w 1 ; <- maximum Target number supported
- scsiMaxLUN ds.w 1 ; <- maximum Logical Unit number supported
- scsiSIMVendor ds.b 1 ; <- Vendor ID of SIM (or XPT if bus<FF)
- scsiHBAVendor ds.b 1 ; <- Vendor ID of the HBA
- scsiControllerFamily ds.b 1 ; <- Family of SCSI Controller
- scsiControllerType ds.b 1 ; <- Specific Model of SCSI Controller used
- scsiXPTversion ds.b 4 ; <- version number of XPT
- scsiSIMversion ds.b 4 ; <- version number of SIM
- scsiHBAversion ds.b 4 ; <- version number of HBA
- scsiHBAslotType ds.b 1 ; <- type of "slot" that this HBA is in
- scsiHBAslotNumber ds.b 1 ; <- slot number of this HBA
- scsiSIMsRsrcID ds.w 1 ; <- resource ID of this SIM
- scsiBIReserved3 ds.w 1 ; <-
- scsiAdditionalLength ds.w 1 ; <- additional BusInquiry PB len
- sizeof EQU 112
- ENDR
-
- ; Abort SIM Request PB
- SCSIAbortCommandPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiIOptr ds.l 1 ; Pointer to the PB to abort
- sizeof EQU 40
- ENDR
-
- ; Terminate I/O Process Request PB
- SCSITerminateIOPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiIOptr ds.l 1 ; Pointer to the PB to terminate
- sizeof EQU 40
- ENDR
-
- ; Reset SCSI Bus PB
- SCSIResetBusPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- sizeof EQU 36
- ENDR
-
- ; Reset SCSI Device PB
- SCSIResetDevicePB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- sizeof EQU 36
- ENDR
-
- ; Release SIM Queue PB
- SCSIReleaseQPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- sizeof EQU 36
- ENDR
-
- ; SCSI Get Virtual ID Info PB
- SCSIGetVirtualIDInfoPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiOldCallID ds.w 1 ; -> SCSI ID of device in question
- scsiExists ds.b 1 ; <- true if device exists
- filler ds.b 1
- sizeof EQU 40
- ENDR
-
- ; Create/Lookup/Remove RefNum for Device PB
- SCSIDriverPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiDriver ds.w 1 ; -> DriverRefNum, For SetDriver, <- For GetNextDriver
- scsiDriverFlags ds.w 1 ; <> Details of driver/device
- scsiNextDevice ds DeviceIdent ; <- DeviceIdent of the NEXT Item in the list
- sizeof EQU 44
- ENDR
-
- ; Load Driver PB
- SCSILoadDriverPB RECORD 0
- qLink ds.l 1
- scsiReserved1 ds.w 1
- scsiPBLength ds.w 1
- scsiFunctionCode ds.b 1
- scsiReserved2 ds.b 1
- scsiResult ds.w 1
- scsiDevice ds DeviceIdent
- scsiCompletion ds.l 1
- scsiFlags ds.l 1
- scsiDriverStorage ds.l 1
- scsiXPTprivate ds.l 1
- scsiReserved3 ds.l 1
- scsiLoadedRefNum ds.w 1 ; <- SIM returns refnum of driver
- scsiDiskLoadFailed ds.b 1 ; -> if true, indicates call after failure to load
- filler ds.b 1
- sizeof EQU 40
- ENDR
-
- ; Defines for the scsiTransferType field
-
- scsiTransferBlind EQU 0
- scsiTransferPolled EQU 1
-
- ; Defines for the scsiDataType field
- scsiDataBuffer EQU 0 ; single contiguous buffer supplied
- scsiDataTIB EQU 1 ; TIB supplied (ptr in scsiDataPtr)
- scsiDataSG EQU 2 ; scatter/gather list supplied
-
- ; Defines for the SCSIMgr scsiResult field in the PB header.
- ; $E100 thru E1FF
- ; -$1EFF thru -1E00
- ; -#7935 thru -7681
- ; = 0xE100
- scsiErrorBase EQU -7936
-
- scsiRequestInProgress EQU 1 ; 1 = PB request is in progress
- ; Execution failed 00-2F
- scsiRequestAborted EQU scsiErrorBase + 2 ; -7934 = PB request aborted by the host
- scsiUnableToAbort EQU scsiErrorBase + 3 ; -7933 = Unable to Abort PB request
- scsiNonZeroStatus EQU scsiErrorBase + 4 ; -7932 = PB request completed with an err
- scsiUnused05 EQU scsiErrorBase + 5 ; -7931 =
- scsiUnused06 EQU scsiErrorBase + 6 ; -7930 =
- scsiUnused07 EQU scsiErrorBase + 7 ; -7929 =
- scsiUnused08 EQU scsiErrorBase + 8 ; -7928 =
- scsiUnableToTerminate EQU scsiErrorBase + 9 ; -7927 = Unable to Terminate I/O PB req
- scsiSelectTimeout EQU scsiErrorBase + 10 ; -7926 = Target selection timeout
- scsiCommandTimeout EQU scsiErrorBase + 11 ; -7925 = Command timeout
- scsiIdentifyMessageRejected EQU scsiErrorBase + 12 ; -7924 =
- scsiMessageRejectReceived EQU scsiErrorBase + 13 ; -7923 = Message reject received
- scsiSCSIBusReset EQU scsiErrorBase + 14 ; -7922 = SCSI bus reset sent/received
- scsiParityError EQU scsiErrorBase + 15 ; -7921 = Uncorrectable parity error occured
- scsiAutosenseFailed EQU scsiErrorBase + 16 ; -7920 = Autosense: Request sense cmd fail
- scsiUnused11 EQU scsiErrorBase + 17 ; -7919 =
- scsiDataRunError EQU scsiErrorBase + 18 ; -7918 = Data overrun/underrun error
- scsiUnexpectedBusFree EQU scsiErrorBase + 19 ; -7917 = Unexpected BUS free
- scsiSequenceFailed EQU scsiErrorBase + 20 ; -7916 = Target bus phase sequence failure
- scsiWrongDirection EQU scsiErrorBase + 21 ; -7915 = Data phase was in wrong direction
- scsiUnused16 EQU scsiErrorBase + 22 ; -7914 =
- scsiBDRsent EQU scsiErrorBase + 23 ; -7913 = A SCSI BDR msg was sent to target
- scsiTerminated EQU scsiErrorBase + 24 ; -7912 = PB request terminated by the host
- scsiNoNexus EQU scsiErrorBase + 25 ; -7911 = Nexus is not established
- scsiCDBReceived EQU scsiErrorBase + 26 ; -7910 = The SCSI CDB has been received
- ; Couldn't begin execution 30-3F
- scsiTooManyBuses EQU scsiErrorBase + 48 ; -7888 = Register failed because we're full
- scsiBusy EQU scsiErrorBase + 49 ; -7887 = SCSI subsystem is busy
- scsiProvideFail EQU scsiErrorBase + 50 ; -7886 = Unable to provide requ. capability
- scsiDeviceNotThere EQU scsiErrorBase + 51 ; -7885 = SCSI device not installed/there
- scsiNoHBA EQU scsiErrorBase + 52 ; -7884 = No HBA detected Error
- scsiDeviceConflict EQU scsiErrorBase + 53 ; -7883 = sorry, max 1 refNum per DeviceIdent
- scsiNoSuchXref EQU scsiErrorBase + 54 ; -7882 = no such RefNum xref
- scsiQLinkInvalid EQU scsiErrorBase + 55 ; -7881 = pre-linked PBs not supported
- ; (The QLink field was nonzero)
- ; Parameter errors 40-7F
- scsiPBLengthError EQU scsiErrorBase + 64 ; -7872 = (scsiPBLength is insuf'ct/invalid
- scsiFunctionNotAvailable EQU scsiErrorBase + 65 ; -7871 = The requ. func is not available
- scsiRequestInvalid EQU scsiErrorBase + 66 ; -7870 = PB request is invalid
- scsiBusInvalid EQU scsiErrorBase + 67 ; -7869 = Bus ID supplied is invalid
- scsiTIDInvalid EQU scsiErrorBase + 68 ; -7868 = Target ID supplied is invalid
- scsiLUNInvalid EQU scsiErrorBase + 69 ; -7867 = LUN supplied is invalid
- scsiIDInvalid EQU scsiErrorBase + 70 ; -7866 = The initiator ID is invalid
- scsiDataTypeInvalid EQU scsiErrorBase + 71 ; -7865 = scsiDataType requested not supported
- scsiTransferTypeInvalid EQU scsiErrorBase + 72 ; -7864 = scsiTransferType field is too high
- scsiCDBLengthInvalid EQU scsiErrorBase + 73 ; -7863 = scsiCDBLength field is too big
-
- scsiExecutionErrors EQU scsiErrorBase
- scsiNotExecutedErrors EQU scsiTooManyBuses
- scsiParameterErrors EQU scsiPBLengthError
-
- ; Defines for the scsiResultFlags field
- scsiSIMQFrozen EQU $0001 ; The SIM queue is frozen w/this err
- scsiAutosenseValid EQU $0002 ; Autosense data valid for target
- scsiBusNotFree EQU $0004 ; At time of callback, SCSI bus is not free
-
- ; Defines for the bit numbers of the scsiFlags field in the PB header for the SCSIExecIO function
- kbSCSIDisableAutosense EQU 29 ; Disable auto sense feature
- kbSCSIFlagReservedA EQU 28 ;
- kbSCSIFlagReserved0 EQU 27 ;
- kbSCSICDBLinked EQU 26 ; The PB contains a linked CDB
- kbSCSIQEnable EQU 25 ; Target queue actions are enabled
- kbSCSICDBIsPointer EQU 24 ; The CDB field contains a pointer
- kbSCSIFlagReserved1 EQU 23 ;
- kbSCSIInitiateSyncData EQU 22 ; Attempt Sync data xfer and SDTR
- kbSCSIDisableSyncData EQU 21 ; Disable sync, go to async
- kbSCSISIMQHead EQU 20 ; Place PB at the head of SIM Q
- kbSCSISIMQFreeze EQU 19 ; Return the SIM Q to frozen state
- kbSCSISIMQNoFreeze EQU 18 ; Disallow SIM Q freezing
- kbSCSIDoDisconnect EQU 17 ; Definitely do disconnect
- kbSCSIDontDisconnect EQU 16 ; Definitely don't disconnect
- kbSCSIDataReadyForDMA EQU 15 ; Data buffer(s) are ready for DMA
- kbSCSIFlagReserved3 EQU 14 ;
- kbSCSIDataPhysical EQU 13 ; SG/Buffer data ptrs are physical
- kbSCSISensePhysical EQU 12 ; Autosense buffer ptr is physical
- kbSCSIFlagReserved5 EQU 11 ;
- kbSCSIFlagReserved6 EQU 10 ;
- kbSCSIFlagReserved7 EQU 9 ;
- kbSCSIFlagReserved8 EQU 8 ;
- kbSCSIDataBufferValid EQU 7 ; Data buffer valid
- kbSCSIStatusBufferValid EQU 6 ; Status buffer valid
- kbSCSIMessageBufferValid EQU 5 ; Message buffer valid
- kbSCSIFlagReserved9 EQU 4 ;
-
- ; Defines for the bit masks of the scsiFlags field
- scsiDirectionMask EQU $C0000000 ; Data direction mask
- scsiDirectionNone EQU $C0000000 ; Data direction (11: no data)
- scsiDirectionReserved EQU $00000000 ; Data direction (00: reserved)
- scsiDirectionOut EQU $80000000 ; Data direction (10: DATA OUT)
- scsiDirectionIn EQU $40000000 ; Data direction (01: DATA IN)
- scsiDisableAutosense EQU $20000000 ; Disable auto sense feature
- scsiFlagReservedA EQU $10000000 ;
- scsiFlagReserved0 EQU $08000000 ;
- scsiCDBLinked EQU $04000000 ; The PB contains a linked CDB
- scsiQEnable EQU $02000000 ; Target queue actions are enabled
- scsiCDBIsPointer EQU $01000000 ; The CDB field contains a pointer
- scsiFlagReserved1 EQU $00800000 ;
- scsiInitiateSyncData EQU $00400000 ; Attempt Sync data xfer and SDTR
- scsiDisableSyncData EQU $00200000 ; Disable sync, go to async
- scsiSIMQHead EQU $00100000 ; Place PB at the head of SIM Q
- scsiSIMQFreeze EQU $00080000 ; Return the SIM Q to frozen state
- scsiSIMQNoFreeze EQU $00040000 ; Disallow SIM Q freezing
- scsiDoDisconnect EQU $00020000 ; Definitely do disconnect
- scsiDontDisconnect EQU $00010000 ; Definitely don't disconnect
- scsiDataReadyForDMA EQU $00008000 ; Data buffer(s) are ready for DMA
- scsiFlagReserved3 EQU $00004000 ;
- scsiDataPhysical EQU $00002000 ; SG/Buffer data ptrs are physical
- scsiSensePhysical EQU $00001000 ; Autosense buffer ptr is physical
- scsiFlagReserved5 EQU $00000800 ;
- scsiFlagReserved6 EQU $00000400 ;
- scsiFlagReserved7 EQU $00000200 ;
- scsiFlagReserved8 EQU $00000100 ;
-
- ; bit masks for the scsiIOFlags field in SCSIExecIOPB
- scsiNoParityCheck EQU $0002 ; disable parity checking
- scsiDisableSelectWAtn EQU $0004 ; disable select w/Atn
- scsiSavePtrOnDisconnect EQU $0008 ; do SaveDataPointer upon Disconnect msg
- scsiNoBucketIn EQU $0010 ; don’t bit bucket in during this I/O
- scsiNoBucketOut EQU $0020 ; don’t bit bucket out during this I/O
- scsiDisableWide EQU $0040 ; disable wide transfer negotiation
- scsiInitiateWide EQU $0080 ; initiate wide transfer negotiation
- scsiRenegotiateSense EQU $0100 ; renegotiate sync/wide before issuing autosense
- scsiDisableDiscipline EQU $0200 ; disable parameter checking on SCSIExecIO calls
- scsiIOFlagReserved0080 EQU $0080 ;
- scsiIOFlagReserved8000 EQU $8000 ;
-
- ; Defines for the SIM/HBA queue actions. These values are used in the
- ; SCSIExecIOPB, for the queue action field. [These values should match the
- ; defines from some other include file for the SCSI message phases. We may
- ; not need these definitions here. ]
- scsiSimpleQTag EQU $20 ; Tag for a simple queue
- scsiHeadQTag EQU $21 ; Tag for head of queue
- scsiOrderedQTag EQU $22 ; Tag for ordered queue
-
- ; Defines for the Bus Inquiry PB fields.
- ; scsiHBAInquiry field bits
- scsiBusMDP EQU $80 ; Supports Modify Data Pointer message
- scsiBusWide32 EQU $40 ; Supports 32 bit wide SCSI
- scsiBusWide16 EQU $20 ; Supports 16 bit wide SCSI
- scsiBusSDTR EQU $10 ; Supports Sync Data Transfer Req message
- scsiBusLinkedCDB EQU $08 ; Supports linked CDBs
- scsiBusTagQ EQU $02 ; Supports tag queue message
- scsiBusSoftReset EQU $01 ; Supports soft reset
-
- ; scsiDataTypes field bits
- ; bits 0->15 Apple-defined, 16->30 3rd-party unique, 31 = reserved
- scsiBusDataTIB EQU (1 << scsiDataTIB) ; TIB supplied (ptr in scsiDataPtr)
- scsiBusDataBuffer EQU (1 << scsiDataBuffer) ; single contiguous buffer supplied
- scsiBusDataSG EQU (1 << scsiDataSG) ; scatter/gather list supplied
- scsiBusDataReserved EQU $80000000 ;
-
- ; scsiScanFlags field bits
- scsiBusScansDevices EQU $80 ; Bus scans for and maintains device list
- scsiBusScansOnInit EQU $40 ; Bus scans performed at power-up/reboot
- scsiBusLoadsROMDrivers EQU $20 ; may load ROM drivers to support targets
-
- ; scsiFeatureFlags field bits
- scsiBusInternalExternalMask EQU $000000C0 ; bus internal/external mask
- scsiBusInternalExternalUnknown EQU $00000000 ; not known whether bus is inside or outside
- scsiBusInternalExternal EQU $000000C0 ; bus goes inside and outside the box
- scsiBusInternal EQU $00000080 ; bus goes inside the box
- scsiBusExternal EQU $00000040 ; bus goes outside the box
- scsiBusCacheCoherentDMA EQU $00000020 ; DMA is cache coherent
- scsiBusOldCallCapable EQU $00000010 ; SIM is old call capable
- scsiBusDifferential EQU $00000004 ; Single Ended (0) or Differential (1)
- scsiBusFastSCSI EQU $00000002 ; HBA supports fast SCSI
- scsiBusDMAavailable EQU $00000001 ; DMA is available
-
- ; scsiWeirdStuff field bits
- scsiOddDisconnectUnsafeRead1 EQU $0001 ; Disconnects on odd byte boundries are unsafe with DMA and/or blind reads
- scsiOddDisconnectUnsafeWrite1 EQU $0002 ; Disconnects on odd byte boundries are unsafe with DMA and/or blind writes
- scsiBusErrorsUnsafe EQU $0004 ; Non-handshaked delays or disconnects during blind transfers may cause a crash
- scsiRequiresHandshake EQU $0008 ; Non-handshaked delays or disconnects during blind transfers may cause data corruption
- scsiTargetDrivenSDTRSafe EQU $0010 ; Targets which initiate synchronous negotiations are supported
-
- ; scsiHBAslotType values
- scsiMotherboardBus EQU $01 ; A built in Apple supplied bus
- scsiNuBus EQU $02 ; A SIM on a NuBus card
- scsiPDSBus EQU $03 ; " on a PDS card
- scsiPCIBus EQU $04 ; " on a PCI bus card
- scsiPCMCIABus EQU $05 ; " on a PCMCIA card
- scsiFireWireBridgeBus EQU $06 ; " connected through a FireWire bridge
-
- ; Defines for the scsiDriverFlags field (in SCSIDriverPB)
- scsiDeviceSensitive EQU $0001 ; Only driver should access this device
- scsiDeviceNoOldCallAccess EQU $0002 ; no old call access to this device
-
- ; SIMInitInfo PB
- ; directions are for SCSIRegisterBus call ( -> parm, <- result)
- SIMInitInfo RECORD 0
- SIMstaticPtr ds.l 1 ; <- alloc. ptr to the SIM's static vars
- staticSize ds.l 1 ; -> num bytes SIM needs for static vars
- SIMInit ds.l 1 ; -> pointer to the SIM init routine
- SIMAction ds.l 1 ; -> pointer to the SIM action routine
- SIM_ISR ds.l 1 ; reserved
- SIMInterruptPoll ds.l 1 ; -> pointer to the SIM interrupt poll routine
- NewOldCall ds.l 1 ; -> pointer to the SIM NewOldCall routine
- ioPBSize ds.w 1 ; -> size of SCSI_IO_PBs required for this SIM
- oldCallCapable ds.b 1 ; -> true if this SIM can handle old-API calls
- simInfoUnused1 ds.b 1 ; reserved
- simInternalUse ds.l 1 ; xx not affected or viewed by XPT
- XPT_ISR ds.l 1 ; reserved
- EnteringSIM ds.l 1 ; <- ptr to the EnteringSIM routine
- ExitingSIM ds.l 1 ; <- ptr to the ExitingSIM routine
- MakeCallback ds.l 1 ; <- the XPT layer’s SCSIMakeCallback routine
- busID ds.w 1 ; <- bus number for the registered bus
- simInfoUnused3 ds.w 1 ; <- reserved
- simInfoUnused4 ds.l 1 ; <- reserved
- sizeof EQU 60
- ENDR
-
- ; Glue between SCSI calls and SCSITrap format
-
- xptSCSIAction EQU $0001
- xptSCSIRegisterBus EQU $0002
- xptSCSIDeregisterBus EQU $0003
- xptSCSIReregisterBus EQU $0004
- xptSCSIKillXPT EQU $0005 ; kills Mini-XPT after transition
- xptSCSIInitialize EQU $000A ; Initialize the SCSI manager
-
- ; moveq #kSCSIx, D0; _SCSIAtomic
- IF GENERATING68K THEN
- Macro
- _SCSIAction
- moveq #1,d0
- dc.w $A089
- EndM
- ELSE
- IMPORT SCSIAction
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIRegisterBus
- moveq #2,d0
- dc.w $A089
- EndM
- ELSE
- IMPORT SCSIRegisterBus
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIDeregisterBus
- moveq #3,d0
- dc.w $A089
- EndM
- ELSE
- IMPORT SCSIDeregisterBus
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIReregisterBus
- moveq #4,d0
- dc.w $A089
- EndM
- ELSE
- IMPORT SCSIReregisterBus
- ENDIF
-
- IF GENERATING68K THEN
- Macro
- _SCSIKillXPT
- moveq #5,d0
- dc.w $A089
- EndM
- ELSE
- IMPORT SCSIKillXPT
- ENDIF
-
- ENDIF ; __SCSI__
-